#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
生成Case10企业管理综合评价报告（Word文档）
包含三线表和可视化图表
"""

import pandas as pd
from docx import Document
from docx.shared import Inches, Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
import os

def add_three_line_table(doc, df, title, col_widths=None):
    """
    添加三线表到Word文档
    
    参数:
        doc: Document对象
        df: pandas DataFrame
        title: 表格标题
        col_widths: 列宽列表（英寸）
    """
    # 添加表格标题
    title_para = doc.add_paragraph()
    title_run = title_para.add_run(title)
    title_run.font.size = Pt(12)
    title_run.font.bold = True
    title_run.font.name = '宋体'
    title_run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
    title_para.alignment = WD_ALIGN_PARAGRAPH.CENTER
    
    # 创建表格
    table = doc.add_table(rows=len(df) + 1, cols=len(df.columns))
    table.style = 'Table Grid'
    
    # 设置表头
    header_cells = table.rows[0].cells
    for i, col_name in enumerate(df.columns):
        header_cells[i].text = str(col_name)
        # 设置表头格式
        for paragraph in header_cells[i].paragraphs:
            paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
            for run in paragraph.runs:
                run.font.bold = True
                run.font.size = Pt(10.5)
                run.font.name = '宋体'
                run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
    
    # 填充数据
    for i, row in enumerate(df.itertuples(index=False), start=1):
        cells = table.rows[i].cells
        for j, value in enumerate(row):
            cells[j].text = str(value)
            # 设置单元格格式
            for paragraph in cells[j].paragraphs:
                paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
                for run in paragraph.runs:
                    run.font.size = Pt(10.5)
                    run.font.name = '宋体'
                    run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
    
    # 设置列宽
    if col_widths:
        for i, width in enumerate(col_widths):
            for row in table.rows:
                row.cells[i].width = Inches(width)
    
    # 添加三线表样式（顶线、表头线、底线）
    def add_border(cell, **kwargs):
        """为单元格添加边框"""
        tc = cell._element
        tcPr = tc.get_or_add_tcPr()
        tcBorders = OxmlElement('w:tcBorders')
        for edge in ('top', 'left', 'bottom', 'right'):
            if edge in kwargs:
                border = OxmlElement(f'w:{edge}')
                border.set(qn('w:val'), kwargs[edge]['val'])
                border.set(qn('w:sz'), str(kwargs[edge]['sz']))
                border.set(qn('w:space'), '0')
                border.set(qn('w:color'), kwargs[edge]['color'])
                tcBorders.append(border)
        tcPr.append(tcBorders)
    
    # 顶线（粗线）
    for cell in table.rows[0].cells:
        add_border(cell, 
                  top={'val': 'single', 'sz': '12', 'color': '000000'},
                  left={'val': 'none', 'sz': '0', 'color': 'FFFFFF'},
                  right={'val': 'none', 'sz': '0', 'color': 'FFFFFF'},
                  bottom={'val': 'single', 'sz': '6', 'color': '000000'})
    
    # 中间行（无边框）
    for row in table.rows[1:-1]:
        for cell in row.cells:
            add_border(cell,
                      top={'val': 'none', 'sz': '0', 'color': 'FFFFFF'},
                      left={'val': 'none', 'sz': '0', 'color': 'FFFFFF'},
                      right={'val': 'none', 'sz': '0', 'color': 'FFFFFF'},
                      bottom={'val': 'none', 'sz': '0', 'color': 'FFFFFF'})
    
    # 底线（粗线）
    for cell in table.rows[-1].cells:
        add_border(cell,
                  top={'val': 'none', 'sz': '0', 'color': 'FFFFFF'},
                  left={'val': 'none', 'sz': '0', 'color': 'FFFFFF'},
                  right={'val': 'none', 'sz': '0', 'color': 'FFFFFF'},
                  bottom={'val': 'single', 'sz': '12', 'color': '000000'})
    
    doc.add_paragraph()  # 添加空行

def add_heading_custom(doc, text, level=1):
    """添加自定义标题"""
    heading = doc.add_heading(level=level)
    run = heading.add_run(text)
    run.font.name = '黑体'
    run._element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')
    if level == 1:
        run.font.size = Pt(16)
    elif level == 2:
        run.font.size = Pt(14)
    else:
        run.font.size = Pt(12)
    run.font.bold = True

def add_paragraph_custom(doc, text):
    """添加自定义段落"""
    para = doc.add_paragraph()
    run = para.add_run(text)
    run.font.name = '宋体'
    run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
    run.font.size = Pt(12)
    para.paragraph_format.line_spacing = 1.5
    para.paragraph_format.first_line_indent = Inches(0.3)

def main():
    """主函数"""
    # 创建Word文档
    doc = Document()
    
    # 设置文档标题
    title = doc.add_heading(level=0)
    title_run = title.add_run('企业管理综合评价分析报告')
    title_run.font.name = '黑体'
    title_run._element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')
    title_run.font.size = Pt(22)
    title_run.font.bold = True
    title.alignment = WD_ALIGN_PARAGRAPH.CENTER
    
    subtitle = doc.add_paragraph()
    subtitle_run = subtitle.add_run('基于熵权TOPSIS方法')
    subtitle_run.font.name = '楷体'
    subtitle_run._element.rPr.rFonts.set(qn('w:eastAsia'), '楷体')
    subtitle_run.font.size = Pt(14)
    subtitle.alignment = WD_ALIGN_PARAGRAPH.CENTER
    
    doc.add_paragraph()  # 空行
    
    # 一、研究方法
    add_heading_custom(doc, '一、研究方法', level=1)
    add_paragraph_custom(doc, '本研究采用熵权TOPSIS方法对企业管理进行综合评价。该方法结合了熵权法的客观赋权和TOPSIS法的多目标决策优势，能够科学、客观地评价企业的综合管理水平。')
    
    add_heading_custom(doc, '1.1 熵权法', level=2)
    add_paragraph_custom(doc, '熵权法是一种客观赋权方法，根据各指标数据的离散程度确定权重。信息熵越小，指标的差异越大，权重越高。')
    
    add_heading_custom(doc, '1.2 TOPSIS法', level=2)
    add_paragraph_custom(doc, 'TOPSIS法通过计算评价对象与正理想解和负理想解的距离，确定相对贴近度，进而对评价对象进行排序。相对贴近度越大，综合表现越好。')
    
    doc.add_page_break()
    
    # 二、评价指标体系
    add_heading_custom(doc, '二、评价指标体系', level=1)
    add_paragraph_custom(doc, '本研究构建了包含6个维度的企业管理综合评价指标体系：')
    
    # 读取权重数据（从日志中提取）
    indicators_data = {
        '指标名称': ['盈利能力', '成长能力', '运营效率', '创新能力', '风险控制', '客户满意度'],
        '熵值(E)': [0.999138, 0.998918, 0.999035, 0.999101, 0.999114, 0.999341],
        '差异系数(D)': [0.000862, 0.001082, 0.000965, 0.000899, 0.000886, 0.000659],
        '权重(W)': [0.100000, 0.100000, 0.100000, 0.100000, 0.100000, 0.100000]
    }
    df_indicators = pd.DataFrame(indicators_data)
    
    # 格式化数值
    df_indicators['熵值(E)'] = df_indicators['熵值(E)'].apply(lambda x: f'{x:.6f}')
    df_indicators['差异系数(D)'] = df_indicators['差异系数(D)'].apply(lambda x: f'{x:.6f}')
    df_indicators['权重(W)'] = df_indicators['权重(W)'].apply(lambda x: f'{x:.4f}')
    
    add_three_line_table(doc, df_indicators, '表1 评价指标权重', 
                        col_widths=[1.5, 1.2, 1.2, 1.0])
    
    doc.add_page_break()
    
    # 三、评价结果
    add_heading_custom(doc, '三、评价结果', level=1)
    
    # 读取评价结果CSV
    df_results = pd.read_csv('output/cases/enterprise_evaluation_results.csv')
    
    # 准备三线表数据
    df_table = df_results[['company', 'rank', 'final_score', 'closeness', 'performance_level']].copy()
    df_table.columns = ['企业名称', '排名', '综合得分', '相对贴近度', '绩效等级']
    
    # 格式化数值
    df_table['综合得分'] = df_table['综合得分'].apply(lambda x: f'{x:.2f}')
    df_table['相对贴近度'] = df_table['相对贴近度'].apply(lambda x: f'{x:.6f}')
    
    add_three_line_table(doc, df_table, '表2 企业管理综合评价结果', 
                        col_widths=[1.2, 0.8, 1.0, 1.2, 1.0])
    
    # 添加结果说明
    add_paragraph_custom(doc, f'从评价结果来看，{df_table.iloc[0]["企业名称"]}以{df_table.iloc[0]["综合得分"]}分的综合得分位列第一，表现最优；'
                              f'{df_table.iloc[-1]["企业名称"]}得分{df_table.iloc[-1]["综合得分"]}分，排名最后。'
                              f'前三名企业均达到"优秀"等级，显示出较强的综合管理能力。')
    
    doc.add_page_break()
    
    # 四、可视化分析
    add_heading_custom(doc, '四、可视化分析', level=1)
    
    # 图表列表
    figures = [
        ('output/cases/figures/enterprise_evaluation_ranking.png', '图1 企业管理综合评价得分排名'),
        ('output/cases/figures/enterprise_closeness_comparison.png', '图2 企业相对贴近度对比'),
        ('output/cases/figures/indicator_weights.png', '图3 评价指标权重分布'),
        ('output/cases/figures/distance_scatter.png', '图4 企业距离散点图'),
        ('output/cases/figures/top5_indicators_comparison.png', '图5 前5名企业各指标原始得分对比'),
        ('output/cases/figures/score_distribution_box.png', '图6 综合得分分布箱线图')
    ]
    
    for fig_path, fig_caption in figures:
        if os.path.exists(fig_path):
            # 添加图片
            doc.add_picture(fig_path, width=Inches(6.0))
            # 添加图注
            caption = doc.add_paragraph()
            caption_run = caption.add_run(fig_caption)
            caption_run.font.name = '宋体'
            caption_run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
            caption_run.font.size = Pt(10.5)
            caption.alignment = WD_ALIGN_PARAGRAPH.CENTER
            doc.add_paragraph()  # 空行
    
    doc.add_page_break()
    
    # 五、结论与建议
    add_heading_custom(doc, '五、结论与建议', level=1)
    
    add_heading_custom(doc, '5.1 主要结论', level=2)
    add_paragraph_custom(doc, '1. 企业间管理水平存在明显差异，综合得分从44.91分到68.93分不等，说明不同企业在管理能力上有较大提升空间。')
    add_paragraph_custom(doc, '2. 各评价指标的权重较为均衡（均为0.10），表明六个维度对企业管理综合评价的重要性相当，需要全面发展。')
    add_paragraph_custom(doc, '3. 排名前三的企业在各项指标上表现均衡，没有明显短板，体现了综合管理能力的重要性。')
    
    add_heading_custom(doc, '5.2 管理建议', level=2)
    add_paragraph_custom(doc, '1. 对于优秀企业：继续保持各项指标的均衡发展，巩固竞争优势，可在创新能力和客户满意度方面进一步提升。')
    add_paragraph_custom(doc, '2. 对于良好企业：重点关注薄弱环节，特别是在盈利能力和运营效率方面加强管理，向优秀企业学习最佳实践。')
    add_paragraph_custom(doc, '3. 对于一般企业：需要全面提升管理水平，优先改善风险控制和运营效率，建立系统的管理改进计划。')
    
    add_heading_custom(doc, '5.3 方法局限性', level=2)
    add_paragraph_custom(doc, '1. 熵权法完全依赖数据的离散程度，可能忽略某些重要但数据变化不大的指标。')
    add_paragraph_custom(doc, '2. TOPSIS方法假设各指标间相互独立，实际中指标间可能存在相关性。')
    add_paragraph_custom(doc, '3. 评价结果受样本数据质量影响较大，需要确保数据的准确性和完整性。')
    
    # 保存文档
    output_path = 'output/cases/企业管理综合评价分析报告_Case10.docx'
    doc.save(output_path)
    print(f'✓ Word报告已生成: {output_path}')
    print(f'✓ 包含2个三线表和6张可视化图表')

if __name__ == '__main__':
    main()

